#include "weight.h"
#include<QString>
#include<QtAlgorithms>
#include <math.h>
#include<QVector>
#include<QSet>
#include<QList>
#include<QStringList>

void Get_Weight(const QList<QVector<QString> >&Doc, QVector<QVector<double> >& Termdoc,QString& Weight_Type)
{

    QVector<double>kol;
    QSet<QString> Unic_Term;
    for(int i=0;i<Doc.count();++i)
    {
        for(int j=0;j<Doc[i].count();++j)
        {
            Unic_Term+=Doc[i].value(j);
    }
    }
    int n=0;
    if(Weight_Type!="Logic" | Weight_Type!="tf")
    {
    for(int i=0;i<Unic_Term.count();++i)

    {
        n=0;
        for(int j=0;j<Doc.count();++j)
        {
        if(Doc.value(j).indexOf(Unic_Term.toList().value(i))>=0) n=n+1;
        }
       kol.append(n);
    }
        }
    QVector<double> R;

    double m=0, m1=0, mm=0;
    if(Weight_Type=="tfc")
    {
        for(int i=0;i<Doc.count();++i)
        {
         for(int j=0;j<Unic_Term.count();++j)
         {
             qCount(Doc.value(i),Unic_Term.toList().value(j),m);
         m1=m1+pow(m*log(Doc.count()/kol.value(j)),2);
        }
        }
    }
    for(int i=0;i<Doc.count();++i)
    {
     R.clear();

       for(int j=0;j<Unic_Term.count();++j)
       {
          m=0;
          if(Weight_Type=="tf"|Weight_Type=="Logic") qCount(Doc.value(i),Unic_Term.toList().value(j),m);
         if(Weight_Type=="Logic" && m!=0) m=1;
          if(Weight_Type=="tf-idf")
          {
            mm=0;
              qCount(Doc.value(i),Unic_Term.toList().value(j),mm);
            m=mm*log(Doc.count()/kol.value(j));
          }
          if(Weight_Type=="tfc")
          {
              qCount(Doc.value(i),Unic_Term.toList().value(j),m1);
              m=(m1*log(Doc.count()/kol.value(j)))/sqrt(m1);
          }
          R.append(m);
       }
       Termdoc.append(R);
    }
}

